//
// Created by shenbin on 2022/4/16.
//

#ifndef ALGORITHM_TRAINNING_C01_LC25_H
#define ALGORITHM_TRAINNING_C01_LC25_H

class LeetCode25 {
private:

    struct ListNode {
        int val;
        ListNode *next;

        ListNode() : val(0), next(nullptr) {}

        ListNode(int x) : val(x), next(nullptr) {}

        ListNode(int x, ListNode *next) : val(x), next(next) {}
    };

public:
    ListNode reverseKGroup(ListNode *head, int k) {
        while (head != nullptr) {
            // 1. 分组（往后走k-1步，找到一组）
            //    一组的开头head 结尾end
            ListNode *end = getEnd(head, k);
            if (end == nullptr) {
                break;
            }
            ListNode *nextGroupHead = end->next;
            //
            head = nextGroupHead;

            // 2. 一组内部（head和end之间）要反转（调用反转链表）
        }
        // 3. 更新每组跟前一组、后一组之间边


    }

    /**
     * 返回走k-1步之后的结点
     * 返回null表示不够k个
     * @param head
     * @return
     */
    ListNode *getEnd(ListNode *head, k) {
        while (head != nullptr) {
            k--;
            if (k == 0) {
                return head;
            }
            head = head->next;
        }
        return nullptr;
    }
};

#endif //ALGORITHM_TRAINNING_C01_LC25_H
